const { ethers, deployments, getNamedAccounts } = require("hardhat")
const { assert, expect } = require("chai")

describe("test vote contract...", async function () {
    let vote

    let voteContract
    let firstSigner // 第一个账户的签名者
    let secondSigner // 第二个账户的签名者

    this.beforeEach(async function () {
        await deployments.fixture(["all"])
        // 2. 获取所有测试账户的签名者（包含私钥，可发送交易）
        const signers = await ethers.getSigners()
        // signers[0] 是第一个账户，signers[1] 是第二个账户
        firstSigner = signers[0]
        secondSigner = signers[1]

        // 3. 连接到部署好的合约（用第一个签名者作为默认连接）
        const voteDeployment = await deployments.get("Vote")
        voteContract = await ethers.getContractAt(
            "Vote",
            voteDeployment.address,
            firstSigner // 绑定默认签名者
        )

        // 4. 预先添加候选人（用第一个账户）
        console.log("====", voteDeployment.address)
        await voteContract.addCandidate("bear")
        await voteContract.addCandidate("ted")
    })

    it("add vote success ", async function () {
        const [name, count] = await vote.getOneVoteNum(0)
        console.log("=name===", name)
        await expect(count).to.equal(0)
    })
    it("vote ", async function () {
        // 第一个账户投票
        await voteContract.vote(0) // 已绑定 firstSigner，可直接调用

        // 第二个账户投票
        await voteContract.connect(secondSigner).vote(0)

        // 验证总票数为2
        const [_, voteCount] = await voteContract.getOneVoteNum(0)
        expect(voteCount).to.equal(2)
    })
    it("get winner ", async function () {
        // 第一个账户投票
        await voteContract.vote(0) // 已绑定 firstSigner，可直接调用
        // 第二个账户投票
        await voteContract.connect(secondSigner).vote(0)

        await voteContract.endVote()
        // 获取中奖者
        const [winnerId, winnerName, voteCount] = await voteContract.getWinner()

        console.log("1111", voteCount)
        // 5. 验证获胜者信息
        expect(winnerId).to.equal(0) // 获胜者ID应为0
        expect(winnerName).to.equal("bear") // 获胜者姓名应为"bear"
        expect(voteCount).to.equal(2) // 获胜者得票数应为2
    })
})
